﻿using System;
using System.Collections.Generic;
using System.Data;

using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Lib.Common;
using Lib.Utility;
using Module.BusinessLogic;
using Module.Core.LoginSystem.Commons.Framwork;
using Module.Core.LoginSystem.Components.Audits;
using Module.Core.LoginSystem.Components.Modules;
using Module.EntitiesInfo;
using System.Linq;
namespace Web.Cms.Questions
{
    public partial class AddEditQuestionAnswer : AdminUserControl
    {
        #region Khai báo
        int questionId = 0;
        private int answerId = 0;
        DataTable dt;
        #endregion

        #region Page_Load
        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                answerId = ConvertUtility.ToInt32(Request.QueryString["answerId"]) == null ? 0 : ConvertUtility.ToInt32(Request.QueryString["answerId"]);
                questionId = ConvertUtility.ToInt32(Request.QueryString["questionId"]) == null ? 0 : ConvertUtility.ToInt32(Request.QueryString["questionId"]);

                if (questionId > 0)
                {
                    btnUpdateQuestion.Visible = true;
                    btnAddQuestion.Visible = false;
                    alinkBack.Visible = true;
                }
                else
                {
                    btnUpdateQuestion.Visible = false;
                    btnAddQuestion.Visible = true;
                    divAnswer.Visible = false;
                    btnCanelQuestion.Visible = false;
                }

                if (!IsPostBack)
                {
                    //Fill dữ liệu thể loại câu hỏi                    
                    CategoryBL.FillDropList(dropCategoryId, "0");

                    QuestionTextbox();
                    AnswerTextbox();
                }
            }
            catch (Exception)
            {

                throw;
            }
        }

        #endregion

        #region OnPreRender
        protected override void OnPreRender(EventArgs e)
        {
            try
            {
                base.OnPreRender(e);
                LoadDataAnswer();
            }
            catch (Exception ex)
            {
                lblUpdateStatus.Text = ex.Message;
            }

        }
        #endregion

        #region Lấy dữ liệu gán vào textbox
        private void QuestionTextbox()
        {
            try
            {
                if (questionId > 0)
                {
                    btnUpdate.Visible = true;
                    btnAdd.Visible = false;
                    QuestionInfo info = QuestionBL.GetInfo(questionId);
                    if (info != null)
                    {
                        txtQuestion.Text = info.Question.ToString();
                        dropCategoryId.SelectedValue = info.CategoryId.ToString();
                        dropAnswerType.SelectedValue = info.AnswerType.ToString();
                    }
                }
                else
                {
                    btnUpdate.Visible = false;
                    btnAdd.Visible = true;

                }
            }
            catch (Exception ex)
            {
                lblUpdateStatus.Text = "Có lỗi xảy ra Error: " + ex.Message;
            }
        }

        private void AnswerTextbox()
        {
            try
            {
                if (answerId > 0)
                {
                    btnUpdate.Visible = true;
                    btnAdd.Visible = false;
                    AnswerInfo info = AnswerBL.GetInfo(answerId);
                    if (info != null)
                    {
                        txtAnswer.Text = info.Answer.ToString();
                        dropIsCorrect.SelectedValue = info.IsCorrect.ToString();
                        txtIsCorrect.Value = info.IsCorrect.ToString();
                    }
                }
                else
                {
                    btnUpdate.Visible = false;
                    btnAdd.Visible = true;
                }
            }
            catch (Exception ex)
            {
                lblUpdateStatus.Text = "Có lỗi xảy ra Error: " + ex.Message;
            }
        }

        #endregion

        #region Fiil dữ liệu vào Gridview Answer
        private void LoadDataAnswer()
        {
            dt = AnswerBL.GetAllByQuestionId(questionId);
            if (dt != null && dt.Rows.Count > 0)
            {
                grdData.DataSource = dt;
                grdData.RowDataBound += new GridViewRowEventHandler(grdData_RowDataBound);
                grdData.DataBind();
                grdData.Visible = true;
            }
            else
            {
                grdData.Visible = false;
            }
        }

        protected void grdData_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                switch (e.CommandName)
                {
                    case "Commanddelete":
                        int id = ConvertUtility.ToInt32(e.CommandArgument);
                        AnswerBL.Delete(1, id);
                        UpdateBitMaskPosition();
                        //Update giá trị CorrectBitMask vào bảng Question
                        AnswerBL.UpdateStatus(1, questionId, CorrectBitMask());
                        // Insert Cores_Audits
                        ModuleInfo _moduleInfo = ModuleController.GetModule(CurrentCommand.CtrlKey);
                        AuditController.CreateAuditQ(_moduleInfo.ModuleDefID, (int)AuditCode.Delete, CurrentCommand.CtrlKey, CurrentUser.UserID, 0
                                                    , "Xóa câu trả lời Id:" + id, 1, DateTime.Now);
                        //end
                        break;
                }
            }
            catch (Exception)
            {

                throw;
            }
        }

        void grdData_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                e.Row.Cells[0].Text = (e.Row.DataItemIndex + 1).ToString();
            }
        }
        #endregion

        #region FillData Question, Answer
        void FillDataAnswer(AnswerInfo info)
        {

            info.Id = answerId;
            info.QuestionId = questionId;
            info.Answer = txtAnswer.Text.ToString();
            info.CreatedDate = DateTime.Now;
            info.IsCorrect = int.Parse(dropIsCorrect.SelectedValue);
            info.BitMaskPosition = 0;
        }

        void FillDataQuestion(QuestionInfo info)
        {

            info.Id = questionId;
            info.Question = txtQuestion.Text;
            info.CategoryId = ConvertUtility.ToInt32(dropCategoryId.SelectedValue);
            info.CreatedDate = DateTime.Now;
            info.Status = 1;
            info.Type = 1;
            info.CorrectBitMask = 0;
            info.AnswerType = ConvertUtility.ToInt32(dropAnswerType.SelectedValue);
        }
        #endregion

        #region Thêm mới, chỉnh sửa, xóa, hủy câu trả lời
        protected void btnAdd_Click(object sender, EventArgs e)
        {
            try
            {
                if (txtAnswer.Text.Length == 0)
                {
                    MessageBox.Show("Bạn chưa nhập câu trả lời !");
                    txtAnswer.Focus();
                    return;
                }
                if (CheckAnswerType(1) == 1)
                {
                    MessageBox.Show("Câu hỏi này chỉ cho phép 1 đán án đúng !");
                    return;
                }
                AnswerInfo info = new AnswerInfo();
                FillDataAnswer(info);
                int id = AnswerBL.Insert(info);
                if (id > 0)
                {
                    //Update giá trị CorrectBitMask vào bảng Question
                    AnswerBL.UpdateStatus(1, questionId, CorrectBitMask());

                    //Cập nhật vị trí câu trả lời
                    UpdateBitMaskPosition();                    
                    // Insert Cores_Audits
                    ModuleInfo _moduleInfo = ModuleController.GetModule(CurrentCommand.CtrlKey);
                    AuditController.CreateAuditQ(_moduleInfo.ModuleDefID, (int)AuditCode.Create, CurrentCommand.CtrlKey, CurrentUser.UserID, id
                                                ,"Thêm mới câu trả lời:" + txtAnswer.Text, 1, DateTime.Now);
                    //end
                    ClearTextAnswer();
                }
                else
                {
                    lblUpdateStatus.Text = "Đã có lỗi xảy ra";
                }
            }
            catch (Exception ex)
            {
                lblUpdateStatus.Text = "Error: " + ex.Message;
            }
        }

        protected void btnUpdate_Click(object sender, EventArgs e)
        {
            try
            {
                if (CheckAnswerType(2) == 1)
                {
                    MessageBox.Show("Câu hỏi này chỉ cho phép 1 đán án đúng !");
                    return;
                }

                AnswerInfo info = new AnswerInfo();
                FillDataAnswer(info);
                AnswerBL.Update(info);
                //Update giá trị CorrectBitMask vào bảng Question
                AnswerBL.UpdateStatus(1, questionId, CorrectBitMask());
                UpdateBitMaskPosition();
                // Insert Cores_Audits
                ModuleInfo _moduleInfo = ModuleController.GetModule(CurrentCommand.CtrlKey);
                AuditController.CreateAuditQ(_moduleInfo.ModuleDefID, (int)AuditCode.Update, CurrentCommand.CtrlKey, CurrentUser.UserID, questionId
                                            , "Update câu trả lời:" + txtAnswer.Text, 1, DateTime.Now);
                //end

                ClearTextAnswer();                
            }
            catch (Exception ex)
            {
                lblUpdateStatus.Text = "Error: " + ex.Message;
            }
        }
        protected void btnCanel_Click(object sender, EventArgs e)
        {
            HttpContext.Current.Response.Write("<script>window.top.hidePopWinADMIN(false);window.parent.location.href='/cms/Default.aspx?ctrlkey=QuestionManager';</script>");
        }

        #endregion

        #region Thêm mới, chỉnh sửa câu hỏi
        protected void btnAddQuestion_Click(object sender, EventArgs e)
        {
            try
            {
                if (txtQuestion.Text.Length == 0)
                {
                    MessageBox.Show("Bạn chưa nhập câu hỏi !");
                    txtQuestion.Focus();
                    return;
                }
                QuestionInfo info = new QuestionInfo();
                FillDataQuestion(info);
                int id = QuestionBL.Insert(info);
                if (id > 0)
                {
                    // Insert Cores_Audits
                    ModuleInfo _moduleInfo = ModuleController.GetModule(CurrentCommand.CtrlKey);
                    AuditController.CreateAuditQ(_moduleInfo.ModuleDefID, (int)AuditCode.Create, CurrentCommand.CtrlKey, CurrentUser.UserID, id
                                                , "Thêm câu hỏi:" + txtQuestion.Text, 1, DateTime.Now);
                    //end
                    Response.Redirect("/Cms/Default.aspx?ctrlkey=AddEditQuestionAnswer&questionId=" + id);
                }
                else
                {
                    lblUpdateStatus.Text = "Đã có lỗi xảy ra";
                }
            }
            catch (Exception ex)
            {
                lblUpdateStatus.Text = "Error: " + ex.Message;
            }
        }

        protected void btnUpdateQuestion_Click(object sender, EventArgs e)
        {
            try
            {
                QuestionInfo info = new QuestionInfo();
                FillDataQuestion(info);
                QuestionBL.Update(info);
                // Insert Cores_Audits
                ModuleInfo _moduleInfo = ModuleController.GetModule(CurrentCommand.CtrlKey);
                AuditController.CreateAuditQ(_moduleInfo.ModuleDefID, (int)AuditCode.Update, CurrentCommand.CtrlKey, CurrentUser.UserID, questionId
                                            , "Update câu hỏi:" + txtQuestion.Text, 1, DateTime.Now);
                //end
                MessageBox.Show("Bạn đã chỉnh sửa thành công !");
            }
            catch (Exception ex)
            {
                lblUpdateStatus.Text = "Error: " + ex.Message;
            }
        }
        protected void btnCanelQuestion_Click(object sender, EventArgs e)
        {
            Response.Redirect("/cms/Default.aspx?ctrlkey=AddEditQuestionAnswer");
        }

        #endregion

        #region ClearText
        void ClearTextAnswer()
        {
            txtAnswer.Text = "";
            btnUpdate.Visible = false;
            btnAdd.Visible = true;
        }
        void ClearTextQuestion()
        {
            txtQuestion.Text = "";
        }
        #endregion

        #region Get status
        protected string Getvalue(int isCorrect)
        {
            string str = "";
            if (isCorrect == 1)
                str = "Đúng";
            else if (isCorrect == 0)
                str = "Sai";
            else
                str = "N/A";
            return str;
        }
        #endregion

        #region Lấy giá trị câu trả lời dạng bit
        int CorrectBitMask()
        {
            string kq = string.Empty;
            DataTable dt;
            dt = AnswerBL.GetAllByQuestionId(questionId);
            if (dt != null && dt.Rows.Count > 0)
            {
                foreach (DataRow dr in dt.Rows)
                {
                    kq = kq + ConvertUtility.ToInt32(dr["IsCorrect"]);
                }
            }
            return ComomFunctions.BinToInt(kq);
        }
        #endregion

        #region update giá trị BitMaskPosition câu trả lời
        int UpdateBitMaskPosition()
        {
            DataTable dt;
            dt = AnswerBL.GetAllByQuestionId(questionId);
            if (dt != null && dt.Rows.Count > 0)
            {
                int i = 0;
                foreach (DataRow dr in dt.Rows)
                {
                    AnswerBL.UpdateStatus(2, ConvertUtility.ToInt32(dr["Id"]), ComomFunctions.HamMu(i));
                    i++;
                }
            }
            return 0;
        }

        #endregion

        #region Kiểm tra số câu hỏi đúng
        /// <summary>
        /// Kiểm tra đáp án: câu hỏi 1 đáp án đúng, nhiều đáp án đúng
        /// </summary>
        /// <param name="status">2: sửa; 1 thêm mới</param>
        /// <returns></returns>
        int CheckAnswerType(int status)
        {
            int kq = 0;
            QuestionInfo info = new QuestionInfo();
            info = QuestionBL.GetInfo(questionId);// Lấy thông tin câu hỏi
            if (info != null)
            {
                if (dropIsCorrect.SelectedValue == "1" && info.AnswerType == 1)
                {
                    dt = AnswerBL.GetAllByQuestionId(questionId); // Lấy thông tin đáp án
                    if (dt != null && dt.Rows.Count > 0)
                    {
                        DataRow[] dr;
                        dr = dt.Select("IsCorrect=" + 1);
                        if (dr.Count() >= 1 && status == 1)
                        {
                            kq = 1;
                        }
                        else if (dr.Count() >= 1 && status == 2 && int.Parse(txtIsCorrect.Value) == 0)
                        {
                            kq = 1;
                        }
                    }
                }

            }
            return kq;
        }
        #endregion
    }
}